package com.utils.excel;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellReference;

import java.io.File;
import java.io.IOException;

/**
 * 读取excel文件
 */
public class ReadExcel {
	public static void main(String[] args) throws InvalidFormatException, IOException {
		//Workbook:用来操作excel文件的类。注意：org.apache.poi.ss.usermodel.Workbook导入包，不要导错了
		//获取这个文件
		File file = new File("C:\\Users\\panpa\\Desktop\\测试.xls");
		//获取Workbook
		Workbook workbook = WorkbookFactory.create(file);
		//获取工作簿
		//获取工作簿的数量
		int sheetNums = workbook.getNumberOfSheets();
		System.out.println("工作簿的数量有："+sheetNums);

		//正式获取某一个工作簿。
		//方式一：通过工作簿的名称获取
		Sheet sheet = workbook.getSheet("userinfos");
		//workbook.getSheetAt(0);//第几个工作簿。参数：索引，从0开始，长度-1结束。

		//获取所有的物理（实际写过内容的行）行
		int rowNums = sheet.getPhysicalNumberOfRows();
		System.out.println("第一个工作簿行的数量为："+rowNums);

		//专门格式化excel数据，返回字符串
		DataFormatter df = new DataFormatter();
		//使用循环遍历所有的行
		for (int i = 0; i < rowNums; i++) {
			//获取具体的每一行Row:行
			Row row = sheet.getRow(i);

			//获取每一行所有的列 Cell:单元格
			int cellNums = row.getPhysicalNumberOfCells();
			System.out.println("第"+(i+1)+"行有："+cellNums+"列");
			//循环遍历每一行所有的列
			for (int j = 0; j < cellNums; j++) {
				//获取某一行某一列
				Cell cell = row.getCell(j);

				//获取单元格的位置
				//参数1：row.getRowNum()：代表行的索引
				//参数2：cell.getColumnIndex():代表列的索引
				CellReference rf =  new CellReference(row.getRowNum(), cell.getColumnIndex());
				System.out.print(rf.formatAsString()+"-");
				//自动进行了判断，并将这个值座位字符串返回
				System.out.println("API自动格式化："+df.formatCellValue(cell));
				//获取每个单元格的内容
//				Cell.CELL_TYPE_BLANK:空的类型
//				Cell.CELL_TYPE_BOOLEAN:布尔类型
//				Cell.CELL_TYPE_ERROR:警告
//				Cell.CELL_TYPE_FORMULA:公式
//				Cell.CELL_TYPE_NUMERIC:数字型（整数、小数和时间）
//				Cell.CELL_TYPE_STRING:字符串类型
				//使用cell对象获取单元格的类型
				switch (cell.getCellTypeEnum()) {
					case STRING:
						System.out.println("字符串类型:"+cell.getStringCellValue());
						break;
					case NUMERIC:
						//判断这个数字类型到底是不是时间类型。参数：传入一个单元格
						if (DateUtil.isCellDateFormatted(cell)) {
							System.out.println("时间类型:"+cell.getDateCellValue());
						} else {
							System.out.println("数字类型:"+cell.getNumericCellValue());
						}
						break;
					case FORMULA:
						System.out.println("公式类型:"+cell.getCellFormula());
						break;
					case ERROR:
						System.out.println("警告类型:"+cell.getErrorCellValue());
						break;
					case BOOLEAN:
						System.out.println("布尔类型:"+cell.getBooleanCellValue());
						break;
					case BLANK:
						System.out.println("空白类型:");
						break;
					default:
						break;
				}
			}
			System.out.println("-------------------------------------------");
		}

	}
}
